range
golang 的 template 支援 range 循環來遍歷 map、slice 內的內容
{{range $i, $v := .slice}}
{{end}}
關於 點. 和 作用域
在寫template的時候,會經常用到”.”。比如{{.}}、{{len .}}、{{.Value}}、{{$x.Value}}等等。
在template中,點”.”代表當前作用域的當前物件。它類似於蠻多語言的 this 或者 self 。
template feat range
搭配 range 使用
var demoRangeString = "range start \n{{ range $key, $value :=.OneMap }} {{ $key }} ({{ $value }}) \n{{ end }}range end"
type demoRangeStruct struct {
OneMap map[string]string
}
func main() {
tempMap := make(map[string]string)
tempMap["cc"] = "dd"
tempMap["kkkey"] = "vvvalue"
tempMap["dd"] = "dd"
tempMap["fu"] = "ck"
fmt.Println(tempMap)
demoRangePointer := &demoRangeStruct{
OneMap: tempMap,
}
var tpl bytes.Buffer
t := template.Must(template.New("").Parse(demoRangeString))
if err := t.Execute(&tpl, demoRangePointer); err != nil {
fmt.Println(err)
return
}
fmt.Println(tpl.String())
輸出為
map[cc:dd dd:dd fu:ck kkkey:vvvalue]
range start
cc (dd)
dd (dd)
fu (ck)
kkkey (vvvalue)
range end
template feat slice
var demoRangeSliceString = `
{{ range $key, $value :=.OneSlice }}
{{ $key }} ({{ $value }})
{{ end }}
`
type demoRangeSliceStruct struct {
OneSlice []string
}
func main() {
tempSlice := []string{"aa", "bb", "cc"}
fmt.Println(tempSlice)
demoRangeSlicePointer := &demoRangeSliceStruct{
OneSlice: tempSlice,
}
var tpl bytes.Buffer
t := template.Must(template.New("").Parse(demoRangeSliceString))
if err := t.Execute(&tpl, demoRangeSlicePointer); err != nil {
fmt.Println(err)
return
}
fmt.Println(tpl.String())
}
輸出為
[aa bb cc]
0 (aa)
1 (bb)
2 (cc)
在命名 demoRangeSliceString 時 我使用了 `反引號
反引號用來建立原生的字串字面量,這些字串可能由多行組成
原生字串大部份用於輸出多行訊息、HTML以及正則表示式